﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;
using System.Net.Sockets;

using modDatos;

using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;

namespace modLanGame
{
    public static class CServ_WorkGame
    {
        static private object thisLock = new object();

        public static CServidor servidor;

        static Thread hiloConecciones;

       // public static Thread hiloRedireccion;

       // public static Thread hiloEnvio2 = new Thread(new ThreadStart(EnviarDatos2));
       // public static Thread hiloReceiv2 = new Thread(new ThreadStart(RecibirDatos2));

        //datos del juego que maneja el servidor

        static List<CBalasDatos> Disparos; 
        static List<CAsteroidesDatos> Asteroides;
        static List<pqActorMini_Datos> ActoresMini;

        static public void Crear(string IPServer, int max)
        {

            servidor = new CServidor();
            servidor.CrearServidor(IPServer, max);

            Disparos = new List<CBalasDatos>();
            Asteroides = new List<CAsteroidesDatos>();
            ActoresMini = new List<pqActorMini_Datos>(servidor.data.ContactosIN.Length);

            //hiloRedireccion = new Thread(new ThreadStart(redireccionar));
        }

        static public void EsperarConecciones()
        {
            hiloConecciones = new Thread(new ThreadStart(servidor.AceptarConexion));
            hiloConecciones.Start();                       
        }

        static public void redireccionar()
        {
            //while (true)
            //{
            //    RecibirDatos2();
            //    EnviarDatos2();
            //}
            //hiloEnvio2.Start();
            //hiloReceiv2.Start();
        }

        static public void RecibirDatos2()
        {
            pqCmd cmd = new pqCmd();
            pqBalas bala = new pqBalas(); // 1 
            pqAsteoirdes asteroide = new pqAsteoirdes(); // 2
            pqActorMini actorMini = new pqActorMini(); // 0

            byte[] buffByte = new byte[2048];
            int debugin = 0;

            string[] cmdParametres;
            string cmdString = "";

            while (true)
            {
                for (int i = 0; i < servidor.data.maxConc; i++)
                {
                    debugin = servidor.data.ContactosIN[i].Receive(buffByte);
                    cmd.inByte(buffByte);

                    if (cmd.data != null)
                    {
                        cmdParametres = cmd.getParametres();

                        switch (cmdParametres[0])
                        {
                            case "1":
                                bala.data.ClienteDunio = int.Parse(cmdParametres[1]);
                                bala.data.posicionActual.X = int.Parse(cmdParametres[2]);
                                bala.data.posicionActual.Y = int.Parse(cmdParametres[3]);
                                bala.data.posicionAnterior.X = int.Parse(cmdParametres[4]);
                                bala.data.posicionAnterior.Y = int.Parse(cmdParametres[5]);
                                bala.data.name = cmdParametres[6];
                                break;

                        }

                        Disparos.Add(bala.data);
                    }
                }
            }
        }

        static public void EnviarDatos2()
        { 
            //creo un pqCmd con todo los datos

            pqCmd cmd = new pqCmd();
            pqBalas bala = new pqBalas(); // 1 
            pqAsteoirdes asteroide = new pqAsteoirdes(); // 2
            pqActorMini actorMini = new pqActorMini(); // 0

            int debugin = 0;

            string cmdString = "";

            //2° Armo el cmd de las balas 
            while (true)
            {
                List<CBalasDatos> buffBalasDatos = Disparos;

                lock (thisLock)
                {
                    foreach (CBalasDatos item in buffBalasDatos)
                    {
                        cmdString = "1~Datos~";
                        cmdString += item.ClienteDunio + "~";
                        cmdString += item.posicionActual.X + "~";
                        cmdString += item.posicionActual.Y + "~";
                        cmdString += item.name;

                        cmd.data.command = cmdString;

                        for (int i = 0; i < servidor.data.maxConc; i++)
                        {
                            debugin = servidor.data.ContactosOUT[i].Send(cmd.outByte());
                        }
                    }
                }
                
            }
        }

        static public void CalcularTrayectoriaBalas()
        { 
        
        }

        static public void CalcularTrayectoriaAsteroides()
        { 
            
        }
    }
 }
